﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CadCD
{
    // Classe Controlador
    class Controlador
    {
        private List<CD> cds = new List<CD>();
        private int cursor;

        public bool addCD(string titulo, string artista, string categoria, int ano)
        {
            CD cdTemp = new CD();

            if (!cdTemp.setTitulo(titulo))
            {
                return false;
            }

            if (!cdTemp.setArtista(artista))
            {
                return false;
            }

            if (!cdTemp.setCategoria(categoria))
            {
                return false;
            }

            if (!cdTemp.setAno(ano))
            {
                return false;
            }

            cds.Add(cdTemp); // usando o metodo Add da classe List.
            this.cursor = cds.Count - 1;
            return true;
        }

        public string listarTodos()
        {
            string result = "------------------------------------------\n";

            for (int i = 0; i < cds.Count; i++)
            {
                result += cds[i];
                result += String.Format("------------------------------------------\n");
            }

            return result;
        }

        public CD removerCD(CD aux)
        {
            if (aux == null)
            {
                throw new Exception("O cd não existe");
            }
            else
            {
                this.cursor = this.cds.IndexOf(aux);
                this.cds.Remove(aux);

                if (this.cursor >= this.cds.Count - 1)
                {
                    this.cursor = this.cds.Count - 1;
                }
                else if (this.cursor <= 0)
                {
                    this.cursor = 0;
                }

                if (this.cds.Count > 0)
                {
                    return this.cds[this.cursor];
                }
                else
                {
                    throw new Exception("A lista de cds está vazia");
                }                
            }
        }

        public bool alterarCD(string titulo, string artista, int ano, string categoria)
        {
            return true;
        }

        public string listarUmCd(int id_cd)
        {
            
            CD tempCD = this.findCD(id_cd);
            string result = String.Format("------------------------------------------\n");

            if (tempCD == null)
            {
                result += "Erro: CD não existe";
                result += String.Format("------------------------------------------\n");
            }
            else
            {
                result += tempCD;
                result += String.Format("------------------------------------------\n");
            }

            return result;
        }

        public CD findCD(int id)
        {
            CD tempCD = null;

            tempCD = cds.Find(delegate(CD aux)
            {
                this.cursor = this.cds.IndexOf(aux);
                return aux.getId() == id;
            });

            return tempCD;
        }

        public List<CD> findCDAll(string t)
        {
            List<CD> subLista;


            subLista = cds.FindAll(delegate(CD aux){
                return aux.getTitulo().Contains(t) 
                    || aux.getArtista().Contains(t) 
                    || aux.getCategoria().Contains(t);
            });

            return subLista;
        }

        public CD getLastAdded(){
            if (this.cds.Count > 0)
            {
                return this.cds[this.cds.Count - 1];
            }
            else
            {
                throw new Exception("Lista Vazia");
            }
        }

        public CD nextCD()
        {
            if (this.cursor >= this.cds.Count - 1)
            {
                throw new Exception("Final da lista");
            }
            else
            {
                return cds[++this.cursor];
            }
        }

        public CD prevCD()
        {
            if (this.cursor <= 0)
            {
                throw new Exception("Começo da lista");
            }
            else
            {
                return cds[--this.cursor];
            }
        }
    }
}
